package com.jikedaquan.dxc;

import com.jikedaquan.dxc.entity.FileEntity;
import com.jikedaquan.dxc.util.ConfigUtil;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.IOUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class Man {
    static List<String> md5s=new ArrayList<String>();
    public static void main(String[] args) throws IOException {

//        String path="F:\\asyui - 副本.chm";
//        FileInputStream fis= new FileInputStream(path);
//        String md5 = DigestUtils.md5Hex(IOUtils.toByteArray(fis));
//        System.out.println(md5);


        long start=System.currentTimeMillis();
        start();
        long end=System.currentTimeMillis();
        System.out.println(end-start+" :ms");

    }
    public static void start(){
        String rootpath=ConfigUtil.rootpath;
        File rootpathFile=new File(rootpath);
        File[] namesPath=rootpathFile.listFiles();
        List<FileEntity> stus=new ArrayList<FileEntity>();//学生集合
        for (File name:namesPath) {
            //只遍历目录
            if (name.isDirectory()){
                System.out.print("d:"+name.getName()+"\t");
                FileEntity entity=new FileEntity();
                entity.setStuName(name.getName());
                List<Map<String,String>> m=new ArrayList<Map<String, String>>();//文件集合
                getDir(name,m);
                entity.setFiles(m);
                stus.add(entity);//学生添加到集合中
                System.out.println();
            }
        }
        System.out.println("长度："+stus.size());
        //查重
        for (FileEntity stu: stus) {
            System.out.print("姓名:"+stu.getStuName()+"\t\t{");
            //遍历文件集合
            for (Map<String,String> file:stu.getFiles()) {
                for (Map.Entry<String,String> en:file.entrySet()) {
                    //System.out.print(en.getKey()+"=>");//文件名
                    checkHave(stu.getStuName(),en.getValue(),stus);
                }
            }
            System.out.print("}");
            System.out.println();
        }
    }
    public static boolean checkHave(String name,String md5,List<FileEntity> stus){
        System.out.print("[");
        for (FileEntity stu: stus) {

            //遍历文件集合
            for (Map<String,String> file:stu.getFiles()) {

                for (Map.Entry<String,String> en:file.entrySet()) {
                    //System.out.print("f:"+en.getKey()+"=>");//文件名
                    if (md5.equals(en.getValue())&&!name.equals(stu.getStuName())){
                        System.out.print("n:"+stu.getStuName()+" f:"+en.getKey()+"  ");//相同人的姓名
                    }
                }
            }
        }
        System.out.print("] ");
        return false;
    }
    /**
     * 获取目录下的文件，如果是文件打印信息，如果是目录继续迭代
     * @param file
     * @return
     */
    public static void getDir(File file,List<Map<String,String>> files){
        if(file.isDirectory()){
            //过滤隐藏文件夹
            if (file.getName().indexOf(".")==0){
                return;
            }
            //过滤其他文件夹
            String fileName=file.getName();
            for (String key:ConfigUtil.nopath.split(",")) {
                if (fileName.indexOf(key)>-1){
                    return;
                }
            }
            //System.out.print("d:"+file.getName()+"\t");
            for (File son:file.listFiles()) {
                getDir(son,files);
            }
        }else{
            if (file.getName().indexOf(".")==0){//过滤隐藏文件
                return;
            }
            //过滤其他文件
            String fileName=file.getName();
            for (String key:ConfigUtil.nofile.split(",")) {
                if (fileName.indexOf(key)>-1){
                    return;
                }
            }


            HashMap<String,String> mfile=new HashMap<>();
            mfile.put(file.getName(),getFileMd5(file));
            files.add(mfile);
        }
    }
    public static String getFileMd5(File file){
        FileInputStream fis= null;
        String md5="";
        try {
            fis = new FileInputStream(file);
            md5 = DigestUtils.md5Hex(IOUtils.toByteArray(fis));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return md5;
    }
}
